public class Test03 {
    public static void main1(String[] args) {
        //intern方法 把字符串加入到常量池中 ， 常量可能会在很多代码中被反复使用 ，就可以放到常量池中 ， 省下创建/销毁这个常量的开销

        //池 （pool）
        String s1 = "hello";
//        String s2 = "hello";
        char[] ch = {'h','e','l','l','o'};
        String s2 = new String(ch);
        System.out.println(s1 == s2);//false 两个不是一个对象

        s2 = s2.intern();
        System.out.println(s1 == s2);//true

        /*intern 会先判断 “hello” 内容是否在常量池中存在
            1.如果存在 ， 直接返回常量池中的引用
            2.如果不存在则把当前字符串添加到常量池当中 ，在返回引用
        final 是要求value引用的指向不可变 ， 不是value数组内容不可变
         */
        /*
        String 的不可变性：
            String 里面的内容 ， 核心是通过 byte数组来保存的
            1.数组本身是 private ， 外界无法直接访问
            2.针对这个数组 ， String 类 ， 没有提供 public 的修改方法
        为什么要这样设计？
           优点：1.线程安全 ， 多线程下使用 String 不容易出 bug
                2.容易放到常量池中被缓存的
                3.String 内容不可变 ， 他就有固定的 hasCode ， 编译放到 哈希表中
         */

    }

    public static void main(String[] args) {
        String s = "hello";
        //这个操作本质上不是修改 "hello" , 而是创建一个新的字符串 "hello world"
        s += "world";
        System.out.println(s);

        StringBuilder stringBuilder = new StringBuilder("hello");
        //这个操作就是操作 StringBulider 对象本体，没有创建新的对象
        //创建 StringBuilder 时会额外分配一部分内存空间 ， 后续进行追加操作 ， 就直接往里添加了 ， 如果把空间填满了 ， 还能自动扩容
        stringBuilder.append("world");
        System.out.println(stringBuilder);
    }
}
